/**
 * 安卓白金英雄坛制作组 <br>
 * 文件名：NpcMenuScreen.java <br>
 * 创建时间：2013-7-23 下午6:00:40 <br>
 * 所属项目：GmudEX <br>
 *
 * @author 12548 <br>
 */
package lostland.gmud.exv2.ui;

import android.os.Bundle;

import com.orhanobut.logger.Logger;

import java.util.ArrayList;

import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.listener.GetListener;
import lostland.gmud.exv2.Direction;
import lostland.gmud.exv2.FontSize;
import lostland.gmud.exv2.Game;
import lostland.gmud.exv2.GameConstants;
import lostland.gmud.exv2.GameEvent;
import lostland.gmud.exv2.GameMessageHandler;
import lostland.gmud.exv2.Gmud;
import lostland.gmud.exv2.GmudEvent;
import lostland.gmud.exv2.MainCharTile;
import lostland.gmud.exv2.MapScreen;
import lostland.gmud.exv2.MapTile;
import lostland.gmud.exv2.battle.BattleScreen;
import lostland.gmud.exv2.blgframework.BasicScreen;
import lostland.gmud.exv2.blgframework.impl.BLGGraphics;
import lostland.gmud.exv2.data.*;
import lostland.gmud.exv2.expand.BegForPayMenuScreen;
import lostland.gmud.exv2.ui.core.GmudWindow;
import lostland.gmud.exv2.ui.core.MenuScreen;

/**
 * 类名：NpcMenuScreen <br>
 * 说明：NPC交互菜单，可衍生出谈话、查看、拜师等分支
 *
 * @author 12548
 */
public class NpcMenuScreen extends MenuScreen {


	int npcid;

	static int binding[] = {0, 0, 0, 0, 0, 0, 0, 0};

	public NpcMenuScreen(int npcid) {
		super(getWindows(npcid));
		this.npcid = npcid;

		dummyBorder = new NpcMenuBorder(buttons.length);
	}

	/*
	 * （非 Javadoc）
	 * @see lostland.gmud.exv2.ui.MenuScreen#onClick(int)
	 */
	@Override
	protected void onClick(int i) {

		int index = binding[i];

		if (index == 0) {

			if (IngameData.getInstance().m1npc == npcid) {
				new TalkingScreen("我知道了，多谢来访！").pushToGame();
				this.removeFromGame();
				IngameData.getInstance().m1npc = -1;
				IngameData.getInstance().m1 = true;
				return;
			}

			GmudEvent trigger = Event.getTalkingTriggers().get(npcid);
			if (trigger != null) {
				this.removeFromGame();
				final Bundle args = new Bundle();
				args.putInt("npcMap", MapScreen.getInstance().getMap().getId());
				args.putInt("npcX", MainCharTile.frontAbsX());
				args.putInt("npcY", MainCharTile.frontAbsY());

				Logger.i("参数已设置： npcMap = %d, npcX = %d, npcY = %d", args.getInt("npcMap"), args.getInt("npcX"), args.getInt("npcY"));

				if(!trigger.execute(args)) {
					new TalkingScreen(npcid).pushToGame();
				}
				return;
			}

			if (npcid == 188) {
				getGame().popScreen();
				GameEvent.callEvent(17);
			} else if (npcid == 189) {
				getGame().popScreen();
				GameEvent.callEvent(18);
			} else if (npcid == 135) {
				getGame().popScreen();
				GameEvent.callEvent(20);
			} else {
				new TalkingScreen(npcid).replaceCurrent();
			}
		} else if (index == 1) {
			new LookScreen(npcid).replaceCurrent();
		} else if (index == 2) {
// GmudWorld.bs.setStatus(new BattleStart(false));
// GmudWorld.bs.enemyid = npcid;
// GmudWorld.bs.eob = false;
// instance.setScreen(GmudWorld.bs);
			getGame().popScreen();
			BattleScreen.battle(npcid);
		} else if (index == 5)// && GmudWorld.npc.get(npcid).trading == 101)
		{
			TalkingScreen.ts = MapScreen.getInstance();
			switch (npcid) {
				case 6:
					// 独行大侠
					if (Gmud.mc.exp < 50000) {
						new TalkingScreen("去去去，攒够经验再来吧！").pushToGame();
					} else {
						new TradeScreen(npcid, 101).pushToGame();
					}
					break;
				case 136:
					// 奇葩的鸡
					ArrayList<String> a = new ArrayList<>();
					a.add("神奇的鸡啊，您懂得最多，我该如何从这个鬼地方出去呢？");
					a.add("还没等你反应过来，神奇的鸡一记飞踢，将你踢到了五指山。");
					new EventScreen(a, false).pushToGame();

					EventScreen.ts = new lostland.gmud.exv2.blgframework.CScreen() {
						@Override
						public void present(float deltaTime) {
						}

						@Override
						public void pause() {
						}

						@Override
						public void resume() {
						}

						@Override
						public void dispose() {
						}

						@Override
						public void update(float deltaTime) {
							MapScreen.getInstance().jumpTo(33, 9, 8, Direction.LEFT);
							getGame().popToRootScreen();
						}
					};
// game.setScreen(new TalkingScreen(game,"还没等你反应过来，神奇的鸡一记飞踢，将你踢到了五指山。",false));
// GmudWorld.ms.jumpTo(33, 9, 8, Direction.LEFT);
					break;
				case 205:
					if (!Gmud.mc.have(Gmud.findItem("玄铁令").getId())) {
						new TalkingScreen("去去去，找到玄铁令再来吧！").pushToGame();
					} else {
						new TradeScreen(npcid, 101).pushToGame();
					}
					break;
				default:
					// 前周目的自己
					boolean old = false;
					for (int sq = 0; sq < getGame().data.getSyuume(); sq++) {
						Npc oldmc = getGame().oldmc.get(sq);
						if (!old && npcid == oldmc.id) {
							if (Gmud.mc.getSkilllevel(true) + 10 > oldmc.getSkilllevel(true)) {
								break;
							} else {
								old = true;
								new TalkingScreen("你还是先学好本来的武功再来讨教吧！").pushToGame();
							}
						}
					}
					if (!old) {
						new TradeScreen(npcid, 101).pushToGame();
					}
			}
		} else if (index == 4)// !GmudWorld.npc.get(npcid).qingjiaoable)
		{
			if (Gmud.getNpc(index).trigger4 >= 0) {
				getGame().callTriggerEvent(Gmud.getNpc(index).trigger4, false, 0, 0, 0f, "", 0);
			} else if (masterTest()) {
				TalkingScreen.ts = new TalkingScreen("你跪了下来，向" + Gmud.getNpc(npcid).name
						+ "恭恭敬敬地磕了四个响头，叫道：『师父』！") {

					/*
					 * （非 Javadoc）
					 * @see lostland.gmud.exv2.ui.TalkingScreen#onClick(int, int)
					 */
					@Override
					protected void onClick(int tx, int ty) {
						getGame().popToRootScreen();
					}

				};
				if (Gmud.mc.masterid >= 0) {
					Gmud.getNpc(Gmud.mc.masterid).qingjiaoable = false;
				}
				Gmud.mc.masterid = npcid;
				Gmud.mc.faction = Gmud.getNpc(npcid).faction;
				Gmud.getNpc(Gmud.mc.masterid).qingjiaoable = true;
			}
		} else if (index == 3) {
			new TradeScreen(npcid, (Gmud.getNpc(npcid).trading == 2) ? 2 : 1).pushToGame();
		} else if (index == 6) { // 休息
			Gmud.mc.refresh();
			BasicScreen.timeFlow(GameConstants.SECONDS_PER_DAY / 3); // 休息8个小时。。
			new SleepScreen(1).pushToGame();
		} else if (index == 7) {
			new LockedScreen("正在更新。。").pushToGame();
			BmobQuery<SaveData> q = new BmobQuery<>();
			q.getObject(getGame(), getGame().data.spouseid, new GetListener<SaveData>() {

				@Override
				public void onFailure(int arg0, String arg1) {
					new NotificationScreen("更新失败！").replaceCurrent();
				}

				@Override
				public void onSuccess(SaveData arg0) {

					MainChar spouse = arg0.mc;

					if (spouse.sex != getGame().data.spouse.sex ||
							spouse.age < getGame().data.spouse.age ||
							spouse.faction == 8) {
						new NotificationScreen("更新失败！").replaceCurrent();
					} else {
						GameEvent.doMarriage(arg0);
						new NotificationScreen("更新成功！").replaceCurrent();
					}

				}
			});
		} else if (index == 8) {
//			game.data.divorce();
			getGame().popToRootScreen();
		} else if (index == 12) { //反馈
			getGame().getHandler().obtainMessage(GameMessageHandler.MSG_FEEDBACK).sendToTarget();
			getGame().popScreen();
		} else if (index == 13) { //打赏
			new BegForPayMenuScreen(true).replaceCurrent();
		}
	}

	/*
	 * （非 Javadoc）
	 * @see lostland.gmud.exv2.ui.MenuScreen#onCancel()
	 */
	@Override
	public void onCancel() {
		getGame().popToRootScreen();
	}


	boolean facTest(int fac) {
		if (Gmud.mc.faction != fac && Gmud.mc.faction > 0)
			if (Gmud.mc.faction == 7) {
				new TalkingScreen("你已自创门派，无需拜师吧？").pushToGame();
				return false;
			} else {
				new TalkingScreen("你已另有名师，还要来偷师学艺吗？").pushToGame();
				return false;
			}
		return true;
	}

	boolean masterTest() {
		if (facTest(Gmud.getNpc(npcid).faction)) {
			switch (npcid) {
				case 38:
					if (Gmud.mc.sex != 0) {
						new TalkingScreen("我八卦门功夫一向传男不传女，你还是另择名师吧。").pushToGame();
						return false;
					} else {
						new TalkingScreen(
								"好吧，我暂且收下你，不过我爹的功夫我只学会三成，有机会你再向他老人家请教吧。").pushToGame();
						Gmud.mc.faction = 1;
						return true;
					}
				case 43:
					if (Gmud.mc.maxfp < 500) {
						new TalkingScreen("你内力不足，无法修习八卦门高深武功。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[14] < 50) {
						new TalkingScreen("你混元一气功火候不够，无法修习八卦门高深武功。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[11] < 50) {
						new TalkingScreen("你还是先将刀法练好再说吧。").pushToGame();
						return false;
					} else {
						new TalkingScreen("好吧，从今天起我亲受你功夫，你和宝震就是师兄弟了。").pushToGame();
						Gmud.mc.faction = 1;
						return true;
					}
				case 47:
					if (Gmud.mc.maxfp < 800) {
						new TalkingScreen("你内力不足，无法修习八卦门高深武功。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[14] < 100) {
						new TalkingScreen("你混元一气功火候不够，无法修习八卦门高深武功。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[11] < 100) {
						new TalkingScreen(
								"八卦刀是我派绝学，想当年老夫就凭一把八卦紫金刀闯荡天下，你还是先将刀法练好再说吧。").pushToGame();
						return false;
					} else {
						new TalkingScreen("很好，没想到你竟如此有毅力。老夫就破例收你做关门弟子。").pushToGame();
						Gmud.mc.faction = 1;
						return true;
					}
				case 56:
					if (Gmud.mc.sex == 1) {
						new TalkingScreen("我花间派文武双修，多加努力吧。").pushToGame();
						Gmud.mc.faction = 3;
						return true;
					} else {
						new TalkingScreen("我花间派向来只收女弟子，你还是另择名师吧。").pushToGame();
						return false;
					}
				case 57:
					if (Gmud.mc.skills[19] < 60) {
						new TalkingScreen("你一剪梅花手功夫尚未纯熟，兵刃功夫又怎学得？").pushToGame();
						return false;
					} else {
						new TalkingScreen("掌门人要求只收俊俏女子……不过……好吧，我就收下你了。").pushToGame();
						Gmud.mc.faction = 3;
						return true;
					}
				case 66:
					if (Gmud.mc.skills[19] < 50) {
						new TalkingScreen("你一剪梅花手功夫尚未纯熟，兵刃功夫又怎学得？").pushToGame();
						return false;
					} else {
						new TalkingScreen("掌门人要求只收俊俏女子……不过……好吧，我就收下你了。").pushToGame();
						Gmud.mc.faction = 3;
						return true;
					}
				case 58:
					if (Gmud.mc.maxfp < 1000) {
						new TalkingScreen("你内力修为不足，还是下去勤修好了再来吧！").pushToGame();
						return false;
					} else if (Gmud.mc.skills[9] < 100) {
						new TalkingScreen("我花间派各路武功均蕴有深意，你读书识字基础不够，焉能领会高深武功？"
						).pushToGame();
						return false;
					} else if (Gmud.mc.getface() < 28) {
						new TalkingScreen("我的嫡传弟子莫不是聪明伶俐，美貌如花，收你入门岂不有损我花间派的名头？"
						).pushToGame();
						return false;
					} else {
						new TalkingScreen("有你这样伶俐俊秀的弟子相伴左右也是乐事，为师一定好好点拨于你。"
						).pushToGame();
						Gmud.mc.faction = 3;
						return true;
					}
				case 73:
					new TalkingScreen("很好，牢记红莲教义，跟我勤修武功吧。").pushToGame();
					Gmud.mc.faction = 5;
					return true;
				case 80:
					if (Gmud.mc.skills[25] < 90) {
						new TalkingScreen("你普天同济心法火候不够，无法修习更高深武学。").pushToGame();
						return false;
					} else if (Gmud.mc.getStr() < 30) {
						new TalkingScreen("你膂力不足，无法领会乱披风杖法的精髓。").pushToGame();
						return false;
					} else {
						new TalkingScreen("很好，牢记红莲教义，跟我勤修武功吧。").pushToGame();
						Gmud.mc.faction = 5;
						return true;
					}
				case 90:
					new TalkingScreen("你随我好好练吧，保你以后飞黄腾达。").pushToGame();
					Gmud.mc.faction = 4;
					return true;
				case 87:
					if (Gmud.mc.skills[27] < 60) {
						new TalkingScreen("一刀流技法讲究出出手狠辣，你无法拳修为尚且不够，如何能领会高深武功？"
						).pushToGame();
						return false;
					} else {
						new TalkingScreen("你随我好好练吧，保你以后飞黄腾达。").pushToGame();
						Gmud.mc.faction = 4;
						return true;
					}
				case 94:
					if (Gmud.mc.skills[26] < 120) {
						new TalkingScreen("扶桑功夫全需忍术支持，你还是下去勤修好了再来吧！").pushToGame();
						return false;
					} else if (Gmud.mc.getStr() < 32) {
						new TalkingScreen("我派一刀流刀法以威猛著称，力气不够是难有进境的！").pushToGame();
						return false;
					} else {
						new TalkingScreen("你要多加努力，把我扶桑尹贺一派绝学发扬光大。").pushToGame();
						Gmud.mc.faction = 4;
						return true;
					}
				case 96:
				case 97:
					new TalkingScreen("难得你有志武学，不过常言道太极三年不伤人，需得有常恒之心才能在太极门中出人头地。"
					).pushToGame();
					Gmud.mc.faction = 2;
					return true;
				case 101:
					if (Gmud.mc.maxfp < 1500) {
						new TalkingScreen("你内力不足，无法修习道家高深武功。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[32] < 120) {
						new TalkingScreen("你太极神功火候不够，无法修习道家高深武功。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[31] < 100) {
						new TalkingScreen("太极拳是我派精华，还是专心将其练好再说吧。").pushToGame();
						return false;
					} else if (Gmud.mc.getWxg() < 28) {
						new TalkingScreen("太极剑讲究意在剑先，悟性不够难于领会其理。").pushToGame();
						return false;
					} else {
						new TalkingScreen("很好，没想到老夫有生之年又觅到一可塑之才。").pushToGame();
						Gmud.mc.faction = 2;
						return true;
					}
				case 122:
					if (Gmud.mc.getAttr(Room.ATTR_AGI) < 22) {
						new TalkingScreen("我雪山派武学主旨为招数精妙，依我看你的资质似乎不宜？").pushToGame();
						return false;
					} else {
						new TalkingScreen(
								"很好,你跟著我勤加练习，日后如能和封师兄或白老爷子学上几招，那可终身受用。").pushToGame();
						Gmud.mc.faction = 6;
						return true;
					}
				case 118:
					if (Gmud.mc.getAttr(Room.ATTR_AGI) < 23) {
						new TalkingScreen("我雪山派武学主旨为招数精妙，依我看你的资质似乎不宜？").pushToGame();
						return false;
					} else if (Gmud.mc.skills[36] < 40) {
						new TalkingScreen("你现在的雪山内功太薄弱，无法领会精妙的雪山剑法，还是学好再来吧。"
						).pushToGame();
						return false;
					} else {
						new TalkingScreen("很好，你多加努力，他日争取将雪山剑派在你手中发扬光大。").pushToGame();
						Gmud.mc.faction = 6;
						return true;
					}
				case 110:
					if (Gmud.mc.maxfp < 1200) {
						new TalkingScreen(
								"我雪山独门武功雪影擒拿手需要深厚内力才可运用，我看你还是下去勤修好了再来吧！").pushToGame();
						return false;
					} else if (Gmud.mc.getAttr(Room.ATTR_BON) < 32) {
						new TalkingScreen("擒拿手需强劲内力，根骨太差进境缓慢，你还是先打好基本功再说吧！"
						).pushToGame();
						return false;
					} else {
						new TalkingScreen("很好，你多加努力，他日必有所成。").pushToGame();
						Gmud.mc.faction = 6;
						return true;
					}
				case 165:
					if (Gmud.mc.sex != 0) {
						new TalkingScreen("我少林不收女弟子，施主还是请回吧。").pushToGame();
						return false;
					} else if (Gmud.mc.getAttr(Room.ATTR_WXG) < 14) {
						new TalkingScreen("你悟性不够，无法理解我寺高深经文。").pushToGame();
						return false;
					} else if (Gmud.mc.getAttr(Room.ATTR_BON) < 15) {
						new TalkingScreen("你根骨基础不佳，不利于修行我寺内功。").pushToGame();
						return false;
					} else {
						new TalkingScreen("你要勤练武功，勤读经书，发扬我少林文武之德。").pushToGame();
						return true;
					}
				case 167:
					if (Gmud.mc.sex != 0) {
						new TalkingScreen("我少林不收女弟子，施主还是请回吧。").pushToGame();
						return false;
					} else if (Gmud.mc.getAttr(Room.ATTR_STR) < 28) {
						new TalkingScreen("罗汉拳需要一定膂力做基础。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[60] < 60) {
						new TalkingScreen("你达摩内功修为尚浅，还是再练练吧。").pushToGame();
						return false;
					} else {
						new TalkingScreen("好啊好啊，年纪轻轻，武功就如此精进，是块材料，我就传你几手吧！"
						).pushToGame();
						return true;
					}
				case 170:
					if (Gmud.mc.sex != 0) {
						new TalkingScreen("我少林不收女弟子，施主还是请回吧。").pushToGame();
						return false;
					} else if (Gmud.mc.skills[57] < 100) {
						new TalkingScreen("罗汉拳是少林武功的精髓，你要好好修习").pushToGame();
						return false;
					} else if (Gmud.mc.skills[60] < 60) {
						new TalkingScreen("你达摩内功修为尚浅，还是再练练吧").pushToGame();
						return false;
					} else {
						new TalkingScreen("看你如此努力，我深感欣慰，如今教你武功，秉持正道，莫要坏我佛门声名。"
						).pushToGame();
						return true;
					}
				case 173:
					new TalkingScreen("天下有志之士，皆可入我丐帮。"
					).pushToGame();
					return true;
				case 162:
					if (Gmud.findSkill("神丐心法").levelOf(Gmud.mc) < 100) {
						new TalkingScreen("你基础功还没打好，先修行好神丐心法吧").pushToGame();
						return false;
					} else if (Gmud.findSkill("降龙十八掌").levelOf(Gmud.mc) > 0) {
						new TalkingScreen("降龙十八掌和打狗棒法二者不可兼得，你还是好好修行降龙十八掌吧").pushToGame();
						return false;
					} else {
						new TalkingScreen("记得以后多给我准备点好吃的。"
						).pushToGame();
						return true;
					}
				case 201:
					if (Gmud.findSkill("神丐心法").levelOf(Gmud.mc) < 100) {
						new TalkingScreen("你基础功还没打好，先修行好神丐心法吧").pushToGame();
						return false;
					} else if (Gmud.findSkill("打狗棒法").levelOf(Gmud.mc) > 0) {
						new TalkingScreen("降龙十八掌和打狗棒法二者不可兼得，你还是好好修行打狗棒法吧").pushToGame();
						return false;
					} else {
						new TalkingScreen("记得，好男儿当顶天立地，担当天下！"
						).pushToGame();
						return true;
					}
				default:
					new TalkingScreen("我现在不收徒。").pushToGame();
					return false;
			}

		} else
			return false;


	}

	/*
	 * （非 Javadoc）
	 * @see lostland.gmud.exv2.ui.core.ButtonControlledScreen#show()
	 */
	@Override
	protected void show() {
		BLGGraphics g = (BLGGraphics) getGame().getGraphics();
		Npc t = Gmud.getNpc(npcid);
		final int TOP = 0;
		final int WINDOW_LEFT = 0;

		MapScreen.getInstance().getMap().draw(MapTile.getInstance(), MapScreen.X, MapScreen.Y);
		MainCharTile.getInstance().drawInMap(MainCharTile.getInstance().currentDirection,
				MainCharTile.getInstance().currentStep, MainCharTile.getInstance().X,
				MainCharTile.getInstance().Y);
		g.drawRect(WINDOW_LEFT, TOP, t.name.length() * 12, 12, Gmud.getBgColor());
		g.drawText(t.name, WINDOW_LEFT, TOP, FontSize.FT_12PX);
		dummyBorder.draw();
		for (int i = 0; i < buttons.length; i++) {
			buttons[i].draw();
		}

	}

	static GmudWindow[] getWindows(int npcid) {

		ArrayList<NpcMenuButton> w = new ArrayList<>();
		Npc t = Gmud.getNpc(npcid);

		if (!t.saying.isEmpty()) {
			push(w, 0); // 对话
		}

		if (!t.haveFlag(Npc.FLAG_UNWATCHABLE)) {
			push(w, 1); // 查看
		}

		if (!t.haveFlag(Npc.FLAG_UNFIGHTABLE)) {
			push(w, 2); // 战斗
		}

		if (t.sells.length > 0 || t.trading == 2) {
			push(w, 3); // 交易
		}

		if (t.qingjiaoable || t.haveFlag(Npc.FLAG_TEACHER) || Gmud.mc.masterid == t.id
				|| t.haveFlag(Npc.FLAG_SPOUSE)) {
			push(w, 5);
		} else if ((t.haveFlag(Npc.FLAG_MASTER) && Gmud.mc.masterid != t.id)
				|| (t.trading > 100)) {
			push(w, 4);
		}

		if (t.haveFlag(Npc.FLAG_SPOUSE)) {
			push(w, 6);
			if (!Game.getData().spouseid.equals("")) {
				push(w, 7);
			}
//			push(w, 8);
		}

		if (t.id == 135) {
			push(w, 12);
			push(w, 13);
		}

		NpcMenuButton[] tw = new NpcMenuButton[w.size()];

		for (int i = 0; i < w.size(); i++) {
			tw[i] = w.get(i);
		}

		return tw;

	}


	static void push(ArrayList<NpcMenuButton> w, int i) {
		w.add(new NpcMenuButton(i, w.size()));
		binding[w.size() - 1] = i;
	}

}
